// 可索引签名
const symid = Symbol('productId')
interface Product {
  [symid]: number | string,
  name: string,
  count: number,
  type: string,
  // 可索引签名  可索引属性必须兼容接口中其他类型
  [x:string]: any
}

let p: Product = {
  [symid]: 10,
  name: 'shangpin',
  count: 20,
  type: '外卖',
  // 可索引签名 x:string并不代表键只能是string Symbol,number, boolean 都可以但是实际意义比较小(可能是隐形的 键类型的转换)
  // people: 'child'
}

// 获取接口中的类型 string
type A = Product['name']
// number
type B = Product['count']
// 想要取symbol的类型
// 这样可以拿到  strting | number
type C = Product[typeof symid]

// 如果想要取 整个interface 的联合类型
// 这样可以取出来 但是并不会直观的看见
type D = keyof Product

type AllKeys<T> = T extends any ? T : never

type E = AllKeys<D>



// 元组 1.元素类型确定 2.数量对应
let arr: [string, string, number, number] = ['song', 'tao', 2, 3]
// 可变元组 利用展开运算
let arrs: [string, string, number, ...any[]] = ['song', 'tao', 2, 3, 5]
// 解构
let [a, b, c, ...rest]: [string, string, number, ...any[]] = ['song', 'tao', 2, 3]

let arrss: [string, string, number, ...any[]] = ['song', 'tao', 2, 3]

// 解构  元组 + tag
let [d, e, f, ...rests]: [d_:string, e_:string, f_:number, ...rests_:any[]] = ['song', 'tao', 2, 3]
